package com.fand.persistent.support;

import java.util.Map;

import org.apache.commons.lang3.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.util.CollectionUtils;

import com.fand.context.ContextHolder;
import com.fand.router.support.RouterKeySupport;

public class RouterNamedParameterJdbcTemplateSupport {
	private final static Log log = LogFactory.getLog(RouterNamedParameterJdbcTemplateSupport.class);
	
	private NamedParameterJdbcTemplate defaultTargetNamedParameterJdbcTemplate;
	
	/**
	 * 路由键名
	 */
	private RouterKeySupport routerKeySupport;
	
	private Map<String, NamedParameterJdbcTemplate> targetNamedParameterJdbcTemplates;
	
	public NamedParameterJdbcTemplate getDefaultTargetNamedParameterJdbcTemplate() {
		return this.defaultTargetNamedParameterJdbcTemplate;
	}
	
	/**
	 * 使用对应目标数据源的NamedParameterJdbcTemplateSupport
	 * 
	 * @param value
	 *            值
	 * @param model
	 *            model
	 * @return NamedParameterJdbcTemplate
	 */
	public NamedParameterJdbcTemplate getNamedParameterJdbcTemplate(final String value, Object model) {
		if (StringUtils.isBlank(value)) { return this.defaultTargetNamedParameterJdbcTemplate; }
		
		if (CollectionUtils.isEmpty(this.targetNamedParameterJdbcTemplates)) { return this.defaultTargetNamedParameterJdbcTemplate; }
		
		if (this.routerKeySupport == null) { return this.defaultTargetNamedParameterJdbcTemplate; }
		
		String groupId = null;
		
		if (StringUtils.isNotBlank(ContextHolder.getId())) {
			groupId = this.routerKeySupport.getGroupId(ContextHolder.getId());
		}
		
		final String targetNamedParameterJdbcTemplateKey = this.routerKeySupport.getKey(groupId, value, model);
		
		if (RouterNamedParameterJdbcTemplateSupport.log.isDebugEnabled()) {
			RouterNamedParameterJdbcTemplateSupport.log.debug(value + "的标识为："
			        + targetNamedParameterJdbcTemplateKey);
		}
		
		if (StringUtils.isBlank(targetNamedParameterJdbcTemplateKey)) { return this.defaultTargetNamedParameterJdbcTemplate; }
		
		if (this.targetNamedParameterJdbcTemplates.containsKey(targetNamedParameterJdbcTemplateKey)) { return this.targetNamedParameterJdbcTemplates
		        .get(targetNamedParameterJdbcTemplateKey); }
		
		return this.defaultTargetNamedParameterJdbcTemplate;
	}
	
	public void setDefaultTargetNamedParameterJdbcTemplate(
	        final NamedParameterJdbcTemplate defaultTargetNamedParameterJdbcTemplate) {
		this.defaultTargetNamedParameterJdbcTemplate = defaultTargetNamedParameterJdbcTemplate;
	}
	
	public void setRouterKeySupport(final RouterKeySupport routerKeySupport) {
		this.routerKeySupport = routerKeySupport;
	}
	
	public void setTargetNamedParameterJdbcTemplates(
	        final Map<String, NamedParameterJdbcTemplate> targetNamedParameterJdbcTemplates) {
		this.targetNamedParameterJdbcTemplates = targetNamedParameterJdbcTemplates;
	}
}
